﻿Public Class KillerBytes : Inherits SubprogramasComunes
    Private ReadOnly _descompresores As New List(Of Descompresor)
    Private ReadOnly _tiposArchivo As New List(Of TipoArchivo)
    Private _empaquetador As Empaquetador
    Private _directorioPrincipal As String = ""
    Const TamañoTipoConsideradoEnano As Integer = 1024 * 1024

    Private Sub Descomprime(ByRef archivo As String)
        For Each descompresor In _descompresores
            If descompresor.ComprobarAdmision(GetExtension(archivo)) Then
                Dim directorioSalida As String = _
                    String.Format("{0}\TD_{1}_{2}", My.Computer.FileSystem.GetParentPath(archivo),GetExtension(archivo), GetNombre(archivo))

                If _directorioPrincipal = "" Then _directorioPrincipal = directorioSalida

                descompresor.descomprime(archivo, directorioSalida)

                For Each fichero In My.Computer.FileSystem.GetFiles(directorioSalida, FileIO.SearchOption.SearchAllSubDirectories)
                    Descomprime(fichero)
                Next

                Return
            End If
        Next
    End Sub

    Private Sub AnalizaTipos(ByVal directorio As String)
        Main.Escribe(vbNewLine & "Analizando tipos...")
        Dim triggerNuevoTipo As Boolean = True

        For Each archivo As String In My.Computer.FileSystem.GetFiles(directorio, FileIO.SearchOption.SearchAllSubDirectories)
            For Each tipo As TipoArchivo In _tiposArchivo
                If GetExtension(archivo) = tipo.Tipo Then
                    triggerNuevoTipo = False
                    tipo.NuevoArchivo(archivo)
                    Exit For
                End If

                If _tiposArchivo.IndexOf(tipo) = _tiposArchivo.IndexOf(_tiposArchivo.Last()) Then
                    triggerNuevoTipo = True
                End If
            Next

            If triggerNuevoTipo = True Then
                Main.Escribe(String.Format("Tipo: {0} registrado.", _
                                           AlinearIzquierda(GetExtension(archivo), 20)))
                Dim nuevoTipo As TipoArchivo = New TipoArchivo(GetExtension(archivo))
                nuevoTipo.NuevoArchivo(archivo)
                _tiposArchivo.Add(nuevoTipo)

                triggerNuevoTipo = False
            End If
        Next

        Main.Escribe(vbNewLine & "Totales:")
        For Each tipo As TipoArchivo In _tiposArchivo
            Main.Escribe(String.Format("Tipo {0}: {1} bytes {2} archivos.", _
                                       AlinearIzquierda(tipo.Tipo, 18), _
                                       AlinearDerecha(tipo.Tamaño.ToString, 12), _
                                       AlinearDerecha(tipo.NumeroArchivos.ToString, 7)))
        Next

    End Sub

    Private Sub Empaqueta()

        MoverArchivosSinExtensionAlFinal()

        For Each tipo As TipoArchivo In _tiposArchivo

            If tipo.Tamaño > TamañoTipoConsideradoEnano Then
                _empaquetador.Empaqueta(_directorioPrincipal, tipo.Tipo, tipo.Tipo)
            Else
                _empaquetador.Empaqueta(_directorioPrincipal, tipo.Tipo, ".trash")
            End If
        Next

    End Sub

    Private Sub MoverArchivosSinExtensionAlFinal()
        For Each tipo As TipoArchivo In _tiposArchivo
            If tipo.Tipo = "NO-EXTENSION" AndAlso _tiposArchivo.IndexOf(tipo) < _tiposArchivo.IndexOf(_tiposArchivo.Last) Then
                Dim temp As TipoArchivo = tipo
                _tiposArchivo.RemoveAt(_tiposArchivo.IndexOf(tipo))
                _tiposArchivo.Add(temp)
                Exit Sub
            End If
        Next
    End Sub

    Public Sub New(ByVal fileName As String)
        Initializate()
        Descomprime(fileName)
        AnalizaTipos(_directorioPrincipal)
        Empaqueta()
    End Sub

    Private Sub Initializate()
        Dim descompresorWinRar As New Descompresor("WinRar Decompressor", "Procesadores\UnRAR.exe")
        descompresorWinRar.NuevoTipoArchivoAdmitido(".rar")
        descompresorWinRar.NuevoTipoArchivoAdmitido(".zip")
        descompresorWinRar.Parametro = "%exec% x -y %in% %out%"
        _descompresores.Add(descompresorWinRar)

        Dim descompresorJar As New Descompresor("JAVA JAR Decompressor", "C:\Program Files\Java\jdk1.8.0_05\bin\jar.exe")
        descompresorJar.NuevoTipoArchivoAdmitido(".jar")
        descompresorJar.Parametro = "cd %out%&%exec% xf %in%"
        _descompresores.Add(descompresorJar)

        _empaquetador = New Empaquetador("WinRar Packer", "Procesadores\rar.exe")
        _empaquetador.Parametro = "%exec% a -m0 -r -ep1 %in% %out%"
    End Sub

End Class
